#ifndef _UTIL_DELAY_H_
#define _UTIL_DELAY_H_

#include <stdint.h>

void UtilDelayUs(uint32_t us);
void UtilDelayMs(uint32_t ms);

uint32_t UtilGetTickUs(void);
uint32_t UtilGetTickMs(void);

const char* UtilGetTimeStampHHMMSS(void); //时间戳:时:分:秒
const char* UtilGetTimeStampSSMMMUUU(void); //时间戳:秒:毫秒:微妙

/* 固定周期延时 */
#define UTIL_DELAY_US(us) UtilDelayUs(us - (UtilGetTickUs() % us))

/* 固定周期延时,逐级逼近式,必须放在循环开始位置 */
#define UTIL_DELAY_INIT2 \
    uint32_t _tick = 0, _tickErr;

#define UTIL_DELAY_US2(us, err)         \
    _tickErr = UtilGetTickUs() - _tick; \
    if (_tickErr > 0 && us > _tickErr)  \
    {                                   \
        _tickErr = us - _tickErr;       \
        if (_tickErr > err)             \
        {                               \
            UtilDelayUs(_tickErr / 2);  \
            continue;                   \
        }                               \
    }                                   \
    _tick = UtilGetTickUs();

/* 
 *  固定时间点延时
 *  例如interval=20000,则该函数后必定会在0us、20000us、40000us、60000us、80000us这几个时间点出来
 *  可用于多线程时间同步
 */
#define UTIL_DELAY_NEXT_US(interval) \
    UtilDelayUs(interval - ((UtilGetTickUs() + interval) % interval));

#endif
